package com.atguigu.gmall.product.controller;

import java.util.concurrent.*;

/**
 * @author atguigu-mqx
 */
public class CompletableFutureDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //  创建对象
        //  CompletableFuture<Object> future = new CompletableFuture<>();
        //        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
        //            System.out.println("来人了，开始接客了。");
        //        });
        //
        //        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
        //            //  int i = 1/0;
        //            return 1024;
        //        }).thenApply((p)->{
        //            System.out.println("p:\t"+p);
        //            //  返回值
        //            return p*2;
        //        }).whenComplete((t,u)->{
        //            //  t： 接收上一个执行的结果
        //            System.out.println("t:\t"+t);
        //            //  u： 表示是否有异常
        //            System.out.println("u:\t"+u);
        //        }).exceptionally((f)->{
        //            System.out.println("f:\t"+f);
        //            return 404;
        //        });
        //
        //        //  get 方法只执行一次，通常放在最后！
        //        //  System.out.println(completableFuture.get()); // null
        //        System.out.println(integerCompletableFuture.get()); //  1024

        //  创建一个线程池：
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,// 核心线程池个数据 cpu 密集型：n+1   io 密集型：2n   2n  n+1  n：当前服务器的核数！
                100,
                3L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
                //                new RejectedExecutionHandler() {
                //                    @Override
                //                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                //                        System.out.println("拒绝策略.....");
                //                        return;
                //                    }
                //                }
        );
        //  并行化！
        CompletableFuture<String> completableFutureA = CompletableFuture.supplyAsync(() -> {
            return "hello";
        },threadPoolExecutor);

        //  创建一个completableFutureB 线程
        CompletableFuture<Void> completableFutureB = completableFutureA.thenAcceptAsync((param) -> {
            //  睡眠
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //  打印
            System.out.println(param + ":\tB");

        },threadPoolExecutor);

        //  创建一个completableFuturec 线程
        CompletableFuture<Void> completableFutureC = completableFutureA.thenAcceptAsync((param) -> {
            //  睡眠
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //  打印
            System.out.println(param + ":\tC");
        },threadPoolExecutor);

        System.out.println(completableFutureB.get());
        System.out.println(completableFutureC.get());
        //  关闭
        threadPoolExecutor.shutdown();



    }
}
